#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
from tools import *

# 取第1-40, 50-90 行作为训练数据
data = loadData()
X = np.matrix(np.vstack([data[:40, :-1], data[50:90, :-1]]))
y = np.matrix(np.vstack([data[:40, -1:], data[50:90, -1:]]))

# 加入偏置单元
X = np.hstack([np.ones(y.shape), X])

# 初始化 theta
th = np.matrix(np.zeros((X.shape[1], 1)))

# 梯度下降求theta, 0.05 和 0.01 是测试得到的参数
(theta, J) = gradientDescent(th, X, y, alpha=0.05, lparameter=0.01)

# 画出此时的损失函数图像
# plt.plot(J, color='k', label='train cost')
# plt.legend()

# 以第41-50, 91-100 行作为验证数据
X = np.matrix(np.vstack([data[40:50, :-1], data[90:100, :-1]]))
y = np.matrix(np.vstack([data[40:50, -1:], data[90:100, -1:]]))

# 加入偏置单元
X = np.hstack([np.ones(y.shape), X])

# 求估计值
haty = sigmoid(X * theta)

# 以 0.5 为阈值分类，取 > 或 >= 差别不大
haty = haty > 0.5

# 转为数字型向量打印
print(haty.A1 * 1)

# output:
# [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
# 此时： haty == y
